package com.mashibing.webmaster.controller;

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.mashibing.common.constant.WebMasterConstants;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * @author SNA
 * @date 2025/10/23
 * @Description 验证码控制器，用于生成并返回验证码图片
 **/
@Controller
public class CaptchaController {

    @Autowired
    private DefaultKaptcha kaptcha;


    /**
     * 生成验证码图片接口
     * 该方法用于生成验证码图片并直接输出到HTTP响应流中
     *
     * @param resp HTTP响应对象，用于设置响应头和输出图片数据
     */
    @GetMapping("/captcha.jpg")
    public void captcha(HttpServletResponse resp) {

        //1、验证码图片不需要做存储和缓存
        resp.setHeader("Cache-Control", "no-store, no-cache");
        //2、设置响应头信息，响应内容类型为JPG图片
        resp.setContentType("image/jpg");

        //3、生成验证码文字内容
        String text = kaptcha.createText();

        // 认证需要验证验证码的准确性，基于Shiro将text做存储
        SecurityUtils.getSubject().getSession().setAttribute(WebMasterConstants.KAPTCHA, text);

        //4、基于文字生成对应的图片
        BufferedImage image = kaptcha.createImage(text);

        //5、将生成的验证码图片写入HTTP响应输出流
        // 声明一个 ServletOutputStream 变量，用于获取HTTP响应的输出流
        ServletOutputStream outputStream = null;
        try {
            // 通过 HttpServletResponse 对象获取输出流
            // getOutputStream() 方法返回一个二进制输出流，用于向客户端发送二进制数据（如图片）
            outputStream = resp.getOutputStream();
            // 使用 ImageIO 工具类将 BufferedImage 图片对象写入输出流
            // image: 要输出的 BufferedImage ；"jpg": 指定图片格式为JPEG；outputStream: 目标输出流，即HTTP响应流
            ImageIO.write(image, "jpg", outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
